/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arbol_sintactico_abstracto;

import analizadorlexico.Token;
import java.io.IOException;
import tabla_de_simbolos.Clase;
import tabla_de_simbolos.Constructor;
import tabla_de_simbolos.ErrorSemantico;
import tabla_de_simbolos.Metodo;
import tabla_de_simbolos.TablaDeSimbolos;
import tabla_de_simbolos.Tipo;
import generador_de_codigo.GeneradorDeCodigo;

/**
 *
 * @author Javi
 */
public class Return extends Sentencia {
    private Expresion exp;

    public Return(Token token, Expresion exp) {
        this.token = token;
        this.exp = exp;
    }

    
    @Override
    public Tipo check(Clase clase, Constructor metodo, TablaDeSimbolos ts) throws ErrorSemantico, IOException {
        Tipo t_exp;
        
        if(metodo.esConstructor())  //si metodo es un constructor es un error
            throw new ErrorSemantico("No se puede hacer un return dentro de un constructor. Linea: " + token.getLinea());
        if(exp == null){
            if(!((Metodo)metodo).getTipoRetorno().getNombre().equals("void"))
                throw new ErrorSemantico("Se esperaba tipo de retorno en la linea " + token.getLinea());
            t_exp = ((Metodo)metodo).getTipoRetorno();
        }
        else{
             t_exp = exp.check(clase, metodo,ts);
             
             if(metodo.getModMetodo().getModificador().equals("static"))
                GeneradorDeCodigo.generar("STORE "+ (3 + metodo.getOffsetParam()) + "\n"); //uno menos xq no tiene referencia a this
             else
                 GeneradorDeCodigo.generar("STORE "+ (4 + metodo.getOffsetParam()) + "\n");
             
             if(!t_exp.conforma(((Metodo)metodo).getTipoRetorno()))
                throw new ErrorSemantico("Se esperaba expresion de tipo "+ ((Metodo)metodo).getTipoRetorno().getNombre() + " en la linea " + token.getLinea());
             
             //no debe ejecutar mas nada una vez que realizo el return 
              if(!metodo.getVariables().isEmpty())
                GeneradorDeCodigo.generar("FMEM " + metodo.getVariables().size() + "\n");
        
                GeneradorDeCodigo.generar("STOREFP \n");
        
             // ret canparametros ver si es dinamico o estatico+1 si es dinamico
                if(metodo.getModMetodo().getModificador().equals("static"))
                    GeneradorDeCodigo.generar("RET " + metodo.getParametros().size() + "\n");
                else
                    GeneradorDeCodigo.generar("RET " + (metodo.getParametros().size() + 1) + "\n");
             
             
           }
        return t_exp;
    }
}
